﻿#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

//int main()
//{
//	FILE* pfread = fopen("data.txt", "r");
//	if (pfread==NULL)
//	{
//		perror("fopen");
//		return 1;
//	}
//	FILE* pfwirte = fopen("data_copy.txt", "w");
//	if (pfwirte==NULL)
//	{
//		perror("fopen");
//		fclose(pfread);
//		return 1;
//	}
//	int ch = 0;
//	while ((ch = fgetc(pfread))!=EOF)
//	{
//		fputc(ch, pfwirte);
//	}
//	fclose(pfwirte);
//	pfwirte = NULL;
//	fclose(pfread);
//	pfread = NULL;
//	return 0;
//}


//int main()
//{
//	int a = 1000;
//	FILE* pf = fopen("data.txt", "wb");
//	fwrite(&a, 4, 1, pf);
//	fclose(pf);
//	pf = NULL;
//	return 0;
//}

//
//int main()
//{
//	FILE* pf = fopen("data.txt", "w");   //通过指针FILE* pf找到并打开data.txt文件
//	if (pf==NULL)  //判断pf是否指向NULL
//	{
//		perror("fopen");//perror可以把错误的信息打印到屏幕上
//		return 1;  //在主函数中返回1表示不正常，返回0才正常
//	}
//	fclose(pf);//通过指针FILE* pf找到data.txt文件并关闭
//	pf = NULL;//已经关闭了data.txt文件，创建的pf指针不能为空，否则就变为一个野指针
//	return 0;
//}


//int main()
//{
//	//打开文件
//	FILE* pf = fopen("data.txt", "r");
//	if (pf==NULL)
//	{
//		perror("fopen");
//		return 1;
//	}
//	//读取文件
//	int ch = 0;        //因为文件存储的是ASCII码值，需要使用int类型的变量来接收ASCII码值
//	ch = fgetc(pf);  //读取文件中一个字符，转换为ASCII码值，
//	printf("%c\n", ch);
//	//关闭文件
//	fclose(pf);
//	pf = NULL;
//	return 0;
//}

//int main()
//{
//	//打开文件
//	FILE* pf = fopen("data.txt", "r");
//	if (pf == NULL)
//	{
//		perror("fopen");
//		return 1;
//	}
//	int ch = 0;
//
//	//读取文件
//	while ((ch = fgetc(pf)) != EOF)  //EOF的意思是当文件读取都末尾的空值时，会停止读取
//	{
//		printf("%c ", ch);
//	}
//	//关闭文件
//	fclose(pf);
//	pf = NULL;
//	return 0;
//}

//int main()
//{
//	//打开文件
//	FILE* pf = fopen("data.txt", "w");
//	if (pf == NULL)
//	{
//		perror("fopen");
//		return 1;
//	}
//	//输出字符
//	fputc('a', pf);//把字符a写入data.txt文件中
//	//关闭文件
//	fclose(pf);
//	pf = NULL;
//	return 0;
//}

//int main()
//{
//	//打开文件
//	FILE* pf = fopen("data.txt", "w");
//	if (pf == NULL)
//	{
//		perror("fopen");
//		return 1;
//	}
//	//输出字符
//	fputs("hello world", pf);//把字符串写入data.txt文件中
//	//关闭文件
//	fclose(pf);
//	pf = NULL;
//	return 0;
//}


////事先创建了一个data.txt文件，里面存入hello world字符串
//int main()
//{
//	//打开文件
//	FILE* pf = fopen("data.txt", "r");
//	if (pf == NULL)
//	{
//		perror("fopen");
//		return 1;
//	}
//	//输入字符
//	char str[12];        
//	fgets(str, 12, pf);    //把data.txt文件中的内容前12个字符存入str中
//		printf("%s", str);
//	//关闭文件
//	fclose(pf);
//	pf = NULL;
//	return 0;
//}


//struct S
//{
//	char name[20];
//	int age;
//	float score;
//};
//int main()
//{
//	struct S s = { "lihua",18,97.3f };//结构体s中存放的内容
//	//打开文件
//	FILE* pf = fopen("data.txt", "w");
//	if (pf == NULL)
//	{
//		perror("fopen");
//		return 1;
//	}
//	//输出
//	fprintf(pf, "%s   %d     %f", s.name, s.age, s.score);//把结构体中的内容存放到pf中
//	//关闭文件
//	fclose(pf);
//	pf = NULL;
//	return 0;
//}


//struct S
//{
//	char name[20];
//	int age;
//	float score;
//};
//int main()
//{
//	struct S s = { 0 };//结构体s中存放的内容
//	//打开文件
//	FILE* pf = fopen("data.txt", "r");
//	if (pf == NULL)
//	{
//		perror("fopen");
//		return 1;
//	}
//	//输入
//	fscanf(pf, "%s %d %f", s.name, &(s.age), &(s.score));  //字符串无需取地址，因为会自动取首地址，把data.txt文件中的内容取出来放入结构体s中
//	printf("%s  %d  %f", s.name, s.age, s.score);//打印存放在结构上s中的内容
//	//关闭文件
//	fclose(pf);
//	pf = NULL;
//	return 0;
//}


//int main()
//{
//	//打开文件
//	FILE* pf = fopen("data.txt", "rb");//wb是二进制输出
//	if (pf == NULL)
//	{
//		perror("fopen");
//		return 1;
//	}
//	//二进制输出
//	int arr[5] ;   //创建一个字符串
//	fread(arr, sizeof(int), 5, pf);//把arr大小的文件，以int类型大小，保存5个字符/数字到pf中
//	for (int i = 0; i < 5; i++)
//	{
//		printf("%d ", arr[i]);
//	}
//	//关闭文件
//	fclose(pf);
//	pf = NULL;
//	return 0;
//}

//struct S
//{
//
//	char name[20];
//	int age;
//	float score;
//};
//
//int main()
//{
//	char str[100];
//	struct S s = { "xiaoming" ,18,95.5 };
//	struct S tmp = { 0 };;
//	sprintf(str, "%s %d %f", s.name, s.age, s.score);  //把结构体s中的内容放入str中
//	printf("%s ", str);
//	return 0;
//}


//struct S
//{
//
//	char name[20];
//	int age;
//	float score;
//};
//
//int main()
//{
//	char str[100];
//	struct S s = { "xiaoming" ,18,95.5 };
//	struct S tmp = { 0 };
//	sprintf(str, "%s %d %f", s.name, s.age, s.score);  //把结构体s中的内容放入str中
//	sscanf(str, "%s %d %f", tmp.name, &(tmp.age),&(tmp.score));   //把str中的内容放入tmp结构体中
//	printf("%s %d %f", tmp.name, tmp.age, tmp.score);    //打印结构体tmp中从值
//	return 0;
//}


////在data.txt中存入abcdef内容
//int main()
//{
//	int ch = 0;
//	FILE* pf = fopen("data.txt", "r");
//	if (pf == NULL)
//	{
//		perror("fopen");
//		return 1;
//	}
//	//ch = fgetc(pf);               //fgetc运行完以后，光标会自动偏移一个位置
//	//ch = fgetc(pf);               //fgetc运行完以后，光标会自动偏移一个位置
//	//fseek(pf, 4, SEEK_CUR);  //从当前位置开始偏移4个光标
//	//ch = fgetc(pf);
//	fseek(pf, 4, SEEK_CUR);
//
//	printf("%c", ch);
//	fclose(pf);
//	pf = NULL;
//	return 0;
//}


////在data.txt中存入abcdef内容
//int main()
//{
//	int ch = 0;
//	FILE* pf = fopen("data.txt", "r");
//	if (pf == NULL)
//	{
//		perror("fopen");
//		return 1;
//	}
//
//	fseek(pf, 4, SEEK_CUR);  //从当前位置开始偏移4个光标
//	ch = fgetc(pf);
//	printf("%c\n", ch);
//	printf("%d\n", ftell(pf));
//	rewind(pf);                      //光标恢复到起始位置
//	printf("%d\n", ftell(pf));
//	fclose(pf);
//	pf = NULL;
//	return 0;
//}


////在data.txt中存入abcdef内容
//int main()
//{
//	int ch = 0;
//	FILE* pf = fopen("data.txt", "r");
//	if (pf == NULL)
//	{
//		perror("fopen");
//		return 1;
//	}
//
//	while ((ch = fgetc(pf)) != EOF) // 标准C I/O读取⽂件循环
//	{
//		putchar(ch );//putchar也是打印的意思，这个是打印变量
//	}
//	//判断是什么原因结束的
//	if (ferror(pf))
//		puts("\nI/O error when reading");   //puts是打印的意思
//	else if (feof(pf))
//		puts("\nEnd of file reached successfully");
//	fclose(pf);
//	pf = NULL;
//	return 0;
//}
enum { SIZE = 5 };
int main(void)
{
	double a[SIZE] = { 1.,2.,3.,4.,5. };
	FILE* fp = fopen("test.bin", "wb"); // 必须⽤⼆进制模式
	fwrite(a, sizeof * a, SIZE, fp); // 写 double 的数组
	fclose(fp);
	double b[SIZE];
	fp = fopen("test.bin", "rb");
	size_t ret_code = fread(b, sizeof * b, SIZE, fp); // 读 double 的数组
	if (ret_code == SIZE) {
		puts("Array read successfully, contents: ");
		for (int n = 0; n < SIZE; ++n)
			printf("%f ", b[n]);
		putchar('\n');
	}
	else { // error handling
		if (feof(fp))
			printf("Error reading test.bin: unexpected end of file\n");
		else if (ferror(fp)) {
			perror("Error reading test.bin");
		}
	}
	fclose(fp);
}